package trabajo.dao;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;

import trabajo.modelo.*;
import trabajo.util.ConexionBD;
import trabajo.excepcion.DAOExcepcion;



public class AlquilerDAO extends BaseDAO {
	

	public Alquiler obtener(int _idAlquiler) throws DAOExcepcion {
		System.out.println("AlquilerDAO: obtener(int _idAlquiler)");
		Alquiler alquiler = new Alquiler();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select * from alquiler where idalquiler = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, _idAlquiler);
			rs = stmt.executeQuery();
			if (rs.next()) {
				alquiler.setIdAlquiler(rs.getInt("idAlquiler"));
				alquiler.setIdPersona(rs.getInt("idPersona"));
				alquiler.setCosto(rs.getBigDecimal("costo"));
				//alquiler.setTimestamp(rs.getDate("fecha").);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return alquiler;
	}
	

	public void registarAlquiler(Alquiler _alquiler) throws DAOExcepcion {
			System.out.println("AlquilerDAO: registarAlquiler()");
			
			ResultSet rs = null;
			Connection con = null;
			PreparedStatement stmt = null;
			BigDecimal costo = null;
			
			try {
				con = ConexionBD.obtenerConexion();
				String query;
				//insertando el alquiler
				query = "insert into alquiler(idpersona) VALUES (?)";
				stmt = con.prepareStatement(query);
				stmt.setInt(1, _alquiler.getIdPersona());				
				int i = stmt.executeUpdate();				
				if (i != 1) {
					throw new SQLException("No se pudo insertar");
					}else{
						
					//recuperrando ultimo registro
					int idAlquiler = 0;
                    query = "SELECT LAST_INSERT_ID()";
                    stmt = con.prepareStatement(query);
                    rs = stmt.executeQuery();
                    if (rs.next()) {
                    	idAlquiler = rs.getInt(1);
                    	
                        }                                                          
                    
                    //recuperando el idalquiler
                    _alquiler.setIdAlquiler(idAlquiler);
                    costo = BigDecimal.ZERO;
                    
					//insertando horarios        			
					for(Horario horario : _alquiler.getHorarios()){
						query = "insert into alquilerhorario (idalquiler, idhorario) VALUES (?, ?)";
						stmt = con.prepareStatement(query);
						stmt.setInt(1, _alquiler.getIdAlquiler());
						stmt.setInt(2, horario.getIdHorario());
						costo = costo.add(horario.getCosto());
						int a = stmt.executeUpdate();
						if (a != 1) {
							throw new SQLException("No se pudo actualizar");
							}else{						
								//actualizando el costo
								query = "update alquiler set costo = ? where idalquiler=?";
								stmt = con.prepareStatement(query);
								stmt.setInt(2, _alquiler.getIdAlquiler());
								stmt.setBigDecimal(1, costo);
								int c = stmt.executeUpdate();
								if (c != 1) {
									throw new SQLException("No se pudo actualizar");
									}
							}
						}
						
					}
				
					//insertando servicios
	    			
					for(Servicio servicio : _alquiler.getServicios()){
						query = "insert into alquilerservicio (idalquiler, idservicio) VALUES (?, ?)";
						stmt = con.prepareStatement(query);
						stmt.setInt(1, _alquiler.getIdAlquiler());
						stmt.setInt(2, servicio.getIdServicio());
						costo = costo.add(servicio.getCosto());					
						
						int a = stmt.executeUpdate();
						if (a != 1) {
							throw new SQLException("No se pudo actualizar");
							}else{												
								//actualizando el costo
								query = "update alquiler set costo = ? where idalquiler = ?";
								stmt = con.prepareStatement(query);
								stmt.setInt(2, _alquiler.getIdAlquiler());
								stmt.setBigDecimal(1, costo);
								int c = stmt.executeUpdate();
								if (c != 1) {
									throw new SQLException("No se pudo actualizar");
									}
							}
						
						}										
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		}	
	
	
public Collection<Cancha> listar() throws DAOExcepcion {
		System.out.println("CanchaDAO: listar()");
		Collection<Cancha> c = new ArrayList<Cancha>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select * from cancha";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cancha ca = new Cancha();
				ca.setIdCancha(rs.getInt("idcancha"));
				ca.setNombre(rs.getString("nombre"));
				ca.setDescripcion(rs.getString("descripcion"));
				c.add(ca);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}


	
}
